package com.pai4j.message.model;

import com.pai4j.common.enums.InteractionMessageTypeEnum;
import com.pai4j.domain.vo.dto.BaseMessageDTO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.Map;

/**
 * 消息上下文
 * 封装消息构建和发送过程中的所有上下文信息
 *
 * @author PAI4J Team
 * @date 2025-11-01
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MessageContext {

    /**
     * 消息发送者ID
     */
    private String senderId;

    /**
     * 消息接收者ID
     */
    private String receiverId;

    /**
     * 消息分类（SYSTEM、COMMENT_REPLY、LIKE_COLLECT、FOCUS）
     */
    private String category;

    /**
     * 消息类型（LIKE、COMMENT、REPLY等）
     */
    private String type;

    /**
     * 互动消息类型枚举
     */
    private InteractionMessageTypeEnum messageTypeEnum;

    /**
     * 消息内容
     */
    private String content;

    /**
     * 消息模板代码
     */
    private String templateCode;

    /**
     * 模板变量
     */
    private Object[] templateVars;

    /**
     * 资源类型
     */
    private String resourceType;

    /**
     * 资源ID
     */
    private String resourceId;

    /**
     * 资源信息（自动填充）
     */
    private ResourceInfo resourceInfo;

    /**
     * 评论ID
     */
    private Long commentId;

    /**
     * 回复ID
     */
    private Long replyId;

    /**
     * 活动名称（系统消息）
     */
    private String activityName;

    /**
     * 活动URL（系统消息）
     */
    private String activityUrl;

    /**
     * 发送渠道（message-queue、websocket、email等）
     */
    @Builder.Default
    private String[] channels = new String[]{"message-queue"};

    /**
     * 元数据（用于存储额外信息）
     */
    @Builder.Default
    private Map<String, Object> metadata = new HashMap<>();

    /**
     * 构建的消息DTO对象
     */
    private BaseMessageDTO messageDTO;

    /**
     * 是否跳过拦截器
     */
    @Builder.Default
    private boolean skipInterceptors = false;

    /**
     * 是否异步发送
     */
    @Builder.Default
    private boolean async = false;

    /**
     * 发送优先级（1-10，数字越大优先级越高）
     */
    @Builder.Default
    private int priority = 5;

    /**
     * 添加元数据
     */
    public MessageContext addMetadata(String key, Object value) {
        if (this.metadata == null) {
            this.metadata = new HashMap<>();
        }
        this.metadata.put(key, value);
        return this;
    }

    /**
     * 获取元数据
     */
    @SuppressWarnings("unchecked")
    public <T> T getMetadata(String key) {
        return this.metadata != null ? (T) this.metadata.get(key) : null;
    }

    /**
     * 设置发送渠道
     */
    public MessageContext setChannels(String... channels) {
        this.channels = channels;
        return this;
    }
}

